package com.hsq.ndmall.mq.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @author 黄四清
 * @version 1.0.0
 * @ClassName RabbitTemplateConfig.java
 * @Description TODO
 * @createTime 2021年09月06日 19:53:00
 */
@Configuration
@Slf4j
public class RabbitTemplateConfig {
    @Resource
    RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void initRabbitTemplate(){
        //消息抵达确认回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * 只要消息抵达broker就ack=true
             * @param correlationData 当前消息的唯一关联数据（消息的唯一标示）
             * @param isReceive 消息是否成功收到
             * @param errorMsg 失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean isReceive, String errorMsg) {
                //修改消息状态  为已到达broker
                log.info("消息{}从p--->e，投递状态为：{},异常消息为：{}",correlationData,isReceive,errorMsg);

            }
        });
        //消息抵达队列确认回调
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * 只要消息没有投递到指定的消息队列，就会触发这个失败回调
             * @param message 投递失败的消息详细信息
             * @param status  回复状态码
             * @param replyContent  回复的文本内容
             * @param exchange 当时这个消息发给那个交换机
             * @param routingKey 当时这个消息用哪个路由键
             */
            @Override
            public void returnedMessage(Message message, int status, String replyContent, String exchange, String routingKey) {
                //修改消息状态:已持久化
                log.info("消息{}未能从e--->q，投递状态为：{},失败原因为：{}，交换机为：{}，路由键为：{}",message.getBody(),status,message,exchange,routingKey);
            }
        });
    }
}
